lexer grammar BLexer;

options {
    superClass = AbstractBLexer;
}

@header {
    package com.nts.bupna;
}

PROCESS : 'process';
RECEIVE : 'receive';
INVOKE : 'invoke';

VARS : 'vars';
VAR : 'var';
NAME : 'name';
TYPE : 'type';
PACKAGE : 'package';
METHOD : 'method';
DESC : 'desc';
IMPORTS : 'imports';
SEQUENCE : 'sequence';
ASSIGN : 'assign';
FROM : 'from';
TO : 'to';
REPLY : 'reply';
METHOD_TYPE : 'methodType';
RESULT : 'result';
INIT : 'init';
SERVICE : 'service';
STATIC : 'static';
IF : 'if';
ELSEIF : 'elseif';
ELSE : 'else';
CONDITION : 'condition';
WHILE : 'while';
EXPR : 'expr';
THROW : 'throw';
ERROR : 'error';

LEFT_PAR : '(';

RIGHT_PAR : ')';

LEFT_CURLY : '{';

RIGHT_CURLY : '}';

COMMA : ',';

EQ : '=';

fragment
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;
    
ID_STRING : '"' i=ID '"' { setText($i.text); } ;

QID_STRING : '"' ID ( '.' ID )* '"' {setText(getText().substring(1, getText().length() -1));} ;

ID_LIST_STRING : '"' ID (',' ID)+ '"' {setText(getText().substring(1, getText().length() -1));} ;

QID_STAR_STRING : '"' ID ( '.' ID )* ('.*')?  '"' {setText(getText().substring(1, getText().length() -1));} ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"' {setText(getText().substring(1, getText().length() -1));} 
    ;
    
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;    
    
fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;
    
fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
    
WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {skip();}
    ;
    
COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;};